//引入路由器对象router
import router from './router'
//引入store对象（vuex中的对象）
import store from './store'
//引入element-ui组件库中的消息对象
import {
  Message
} from 'element-ui'
//引入进度条
import NProgress from 'nprogress'
//引入进度条的样式文件
import 'nprogress/nprogress.css'
import {
  getToken
} from '@/utils/auth' // 引入获取token回调函数
//引入拼接页面标题函数（该函数是需要传入路由地址对应的标题名字）
import getPageTitle from '@/utils/get-page-title'
//设置进度条中的进度环显示和隐藏
NProgress.configure({
  showSpinner: false
}) // NProgress Configuration
//白名单列表数据---数组  该名单中只有login路由地址
const whiteList = ['/login'] // no redirect whitelist
//全局前置路由守卫
router.beforeEach(async (to, from, next) => {
  // 开启进度条
  NProgress.start()
  // 设置页面标题
  document.title = getPageTitle(to.meta.title)
  //获取token数据
  const hasToken = getToken()
  // 获取token是否存在 
  if (hasToken) {
    //此时token是存在的，然后判断是不是还要向、login界面 跳转，有token就是登录过，
    //既然如此就没有必要去/login登录页面,直接去/首页即可
    if (to.path === '/login') {
      // 直接跳转到首页
      next({
        path: '/'
      })
      NProgress.done() //关闭进度条
    } else {
      //此时虽然有token（那么就是直接登录了），访问的不是/login
      //有token不代表登录成功，有了token，而且还要有用户名字才能说明登录成功过
      //获取用户信息
      const hasGetUserInfo = store.getters.name
      //判断用户名是否存在
      if (hasGetUserInfo) {
        //此时有token也有用户名字，那么想去哪里就去那里（想要跳转到那地址就可以跳转）
        next()
      } else {
        // 此时有token，但是没有用户名
        try {
          //分发action获取用户名
          await store.dispatch('user/getInfo')
          //有token，用户名也获取成功了，那么也是想去哪里就去哪里
          //===================坑
          next()
        } catch (error) {
          //获取用户名字失败，也就意味着此时的token是无效的，如token是过期的
          //分发重置token的action,所有的token,包括用户信息全部重置
          await store.dispatch('user/resetToken')
          //页面中提示回去用户失败的信息
          Message.error(error || 'Has Error')
          //让页面重新跳转到登录页面
          next(`/login?redirect=${to.path}`)
          NProgress.done() //关闭进度条
        }
      }
    }
  } else {
    //此时没有token数据，推断：没有登录过，那么访问的还是登录页面，当然要放行

    if (whiteList.indexOf(to.path) !== -1) {
      //判断路由目标是不是登录地址（、login）,此时没有token ,而且还是登录页面，那么局放行
      next()
    } else {
      // 没有token，还想访问其他也页面就是不行，让你直接跳转到/login页面，进行登录
      next(`/login?redirect=${to.path}`)
      NProgress.done() //关闭进度条
    }
  }
})
//全局后置路由守卫
router.afterEach(() => {
  // 关闭进度条
  NProgress.done()
})
